module.exports = app => {
    const express = require('express');
    const jwt = require('jsonwebtoken')
    const AdminUser = require('../../models/AdminUser')
    const assert = require('http-assert')
    const router = express.Router({
        // 合并参数
        mergeParams: true
    })
    // 修改文件名
    // let fs = require('fs');

    // 登录授权中间件
    const auth = require('../../middleware/auth')

    // 新建列表
    router.post('/', async (req, res) => {
        const model = await req.Model.create(req.body._value)
        res.send(model)
    })

    // 编辑列表
    router.put('/:id', async (req, res) => {
        const model = await req.Model.findByIdAndUpdate(req.params.id, req.body._value, { useFindAndModify: false })
        res.send(model)
    })

    // 删除列表
    router.delete('/:id', async (req, res) => {
        await req.Model.findByIdAndDelete(req.params.id)
        res.send({
            success: true
        })
    })

    // 获取列表
    router.get('/', async (req, res) => {
        const queryOptions = {}
        if (req.Model.modelName === 'Category') {
            queryOptions.populate = 'parent'
        }
        // populate('parent') 关联取出parent
        const items = await req.Model.find().setOptions(queryOptions).limit(100)
        res.send(items)
    })

    // 获取列表详情
    router.get('/:id', async (req, res) => {
        const model = await req.Model.findById(req.params.id)
        res.send(model)
    })

    // /admin/api/rest/:resource  rest 通用接口 resource 变量
    app.use('/admin/api/rest/:resource', auth(), (req, res, next) => {
        const modelName = require('inflection').classify(req.params.resource)
        req.Model = require(`../../models/${modelName}`)
        next()
    }, router)

    // 上传图片接口
    const multer = require('multer')
    const upload = multer({ dest: __dirname + '/../../public/img' })
    app.post('/admin/api/upload',auth(), upload.single('file'), async (req, res) => {
        const file = req.file
        // 修改文件后缀名
        // fs.rename(('./public/img/' + file.filename), ('./public/img/' + file.filename + '.png'), (err) => {
        //     if (err) {
        //         console.log('出错了');
        //         console.log(err);
        //     }
        // })
        file.url = `http://localhost:3000/public/img/${file.filename}`
        res.send(file)
    })

    // 登录接口
    app.post('/admin/api/login', async (req, res) => {
        const { username, password } = req.body
        // 根据用户名用户
        // password 是默认取不到的 所以需要加 .select('+password')
        const user = await AdminUser.findOne({ username }).select('+password')
        // console.log(user);
        // 确保user存在 不存在抛出422状态码 并提示用户不存在
        assert(user, 422, '用户不存在')
        // if (!user) {
        //     return res.status(422).send({
        //         message: '用户不存在'
        //     })
        // }
        // 校验密码
        const isValid = require('bcrypt').compareSync(password, user.password)
        assert(isValid, 422, '密码错误')
        // 返回token
        //token 生成
        const token = jwt.sign({
            id: user._id,
        }, app.get('secret'))

        res.send(token)
    })
    // 错误处理函数
    app.use(async (err, req, res, next) => {
        // console.log(err);
        res.status(err.statusCode || 500).send({
            message: err.message
        })
    })
} 
